/**
 * 
 */
package com.ms.player;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.ms.game.itembox.Item;
import com.ms.player.message.SUpdatePlayerItem;
import com.xpec.c4.game.utility.GUID;
import com.xpec.c4.message.MessageTypes;
import com.xpec.c4.service.message.MessageAction;
import com.xpec.c4.service.module.ServerProperties;

/**
 * 玩家道具更新清單
 * 
 * @author TW15010
 */
public class UpdateItemList implements Serializable {
	private static final long serialVersionUID = -8437990056611275802L;

	private static final Log log = LogFactory.getLog(UpdateItemList.class);

	/**
	 * 記錄有被變更過的道具資料<br>
	 * key: 道具序號<br>
	 * value: 道具資料
	 */
	private HashMap<String, Item> updateItemMap = new HashMap<String, Item>();

	/**
	 * 增加更新過的道具資料到更新列表 {@link #updateItemMap} 中
	 * 
	 * @param updateItem
	 *            更新過得道具資料
	 */
	public void addUpdateItem(Item updateItem) {
		if (updateItem == null) {
			return;
		}

		updateItemMap.put(updateItem.getSn(), updateItem);
	}

	/**
	 * 取得更新過的道具清單
	 * 
	 * @return 道具清單
	 */
	public ArrayList<Item> getUpdateItemList() {
		ArrayList<Item> updateItemList = new ArrayList<Item>(updateItemMap.values());

		return updateItemList;
	}

	/**
	 * 清除變更過的道具列表
	 */
	public void clear() {
		updateItemMap.clear();
	}

	/**
	 * 將更新後的道具清單套到角色身上
	 * 
	 * @param player
	 *            player 資料
	 */
	public void applyToPlayer(Player player) {
		if (player == null) {
			return;
		}

		ArrayList<Item> updateItemList = getUpdateItemList();

		for (Item item : updateItemList) {
			player.updateItem(item);
		}
	}

	/**
	 * 將有變更的道具清單傳送給 client
	 * 
	 * @param sessionId
	 */
	public void sendToClient(GUID playerId, GUID sessionId, int userType) {
		// 道具數量有更新
		if (updateItemMap.size() == 0) {
			return;
		}

		// 取得更新過的道具列表
		ArrayList<Item> updatedItemList = getUpdateItemList();

		// 消息內容
		SUpdatePlayerItem data = new SUpdatePlayerItem();
		data.addUpdatedItemList(updatedItemList);

		// 送出
		MessageAction.sendMessage(sessionId, MessageTypes.S_ZONE_UPDATE_PLAYER_ITEM, data);

		if (log.isInfoEnabled() && ServerProperties.isSaveConsoleLog(userType)) {
			StringBuilder sb = new StringBuilder();
			sb.append("send update player " + playerId + " item ");
			for (Item item : updatedItemList) {
				sb.append(item.getItemId() + "(" + item.getSn() + ")=" + item.getCount() + " ");
			}

			log.info(sb.toString());
		}

		// 清除列表
		clear();
	}
}